<?
class mysqldriver extends abstractdbdriver
{
   public function __construct($dbinfo)
   {
      if (!empty($dbinfo['dbname']))
      {
         if ($dbinfo['persistent'])
         $this->connection =
            mysql_pconnect($dbinfo['dbhost'],$dbinfo['dbuser'],
            $dbinfo['dbpwd']);
         else
         $this->connection =
            mysql_connect($dbinfo['dbhost'],$dbinfo['dbuser'],
            $dbinfo['dbpwd']);
         mysql_select_db($dbinfo['dbname'],$this->connection);
      }
      else
      throw new Exception("Aby nawiza poczenie z baz danych MySQL, trzeba
         poda nazw uytkownika, haso, serwer oraz nazw uywanej bazy danych.");
   }
   public function execute($sql)
   {
      $sql = $this->prepQuery($sql);
      $parts = split(" ",trim($sql));
      $type = strtolower($parts[0]);
      $hash = md5($sql);
      $this->lasthash = $hash;
      if ("select"==$type)
      {
         if (isset($this->results[$hash]))
         {
            if (is_resource($this->results[$hash]))
            return $this->results[$hash];
         }
      }
      else if("update"==$type || "delete"==$type)
      {
         $this->results = array(); // Usunicie zawartoci bufora wynikw.
      }
      $this->results[$hash] = mysql_query($sql,$this->connection);
   }
   public function count()
   {
      // print_r($this);
      $lastresult = $this->results[$this->lasthash];
      // print_r($this->results);
      $count = mysql_num_rows($lastresult);
      if (!$count) $count = 0;
      return $count;
   }
   private  function prepQuery($sql)
   {
      // Polecenie "DELETE FROM TABLE" zwraca 0 rekordw.
      // Ten kod modyfikuje wymienione zapytanie w taki sposb,
      // aby zwracao ono liczb rekordw, ktre zostay zmodyfikowane przez zapytanie.
      if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
      {
         $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/",
            "DELETE FROM \\1 WHERE 1=1", $sql);
      }
      return $sql;
   }
   public function escape($sql)
   {
      if (function_exists('mysql_real_escape_string'))
      {
         return mysql_real_escape_string($sql, $this->conn_id);
      }
      elseif (function_exists('mysql_escape_string'))
      {
         return mysql_escape_string( $sql);
      }
      else
      {
         return addslashes($sql);
      }
   }
   public function affectedRows()
   {
      return @mysql_affected_rows($this->connection);
   }
   public function insertId()
   {
      return @mysql_insert_id($this->connection);
   }
   public function transBegin()
   {
      $this->execute('SET AUTOCOMMIT=0');
      $this->execute('START TRANSACTION'); // W tym miejscu mona uy rwnie BEGIN lub BEGIN WORK.
      return TRUE;
   }
   public function transCommit()
   {
      $this->execute('COMMIT');
      $this->execute('SET AUTOCOMMIT=1');
      return TRUE;
   }
   public function transRollback()
   {
      $this->execute('ROLLBACK');
      $this->execute('SET AUTOCOMMIT=1');
      return TRUE;
   }
   public function getRow($fetchmode = FETCH_ASSOC)
   {
      $lastresult = $this->results[$this->lasthash];
      if (FETCH_ASSOC == $fetchmode)
      $row = mysql_fetch_assoc($lastresult);
      elseif (FETCH_ROW == $fetchmode)
      $row = mysql_fetch_row($lastresult);
      elseif (FETCH_OBJECT == $fetchmode)
      $row = mysql_fetch_object($lastresult);
      else
      $row = mysql_fetch_array($lastresult,MYSQL_BOTH);
      return $row;
   }
   public function getRowAt($offset=null,$fetchmode = FETCH_ASSOC)
   {
      $lastresult = $this->results[$this->lasthash];
      if (!empty($offset))
      {
         mysql_data_seek($lastresult, $offset);
      }
      return $this->getRow($fetchmode);
   }
   public function rewind()
   {
      $lastresult = $this->results[$this->lasthash];
      mysql_data_seek($lastresult, 0);
   }
   public function getRows($start, $count, $fetchmode = FETCH_ASSOC)
   {
      $lastresult = $this->results[$this->lasthash];
      mysql_data_seek($lastresult, $start);
      $rows = array();
      for ($i=$start; $i<=($start+$count); $i++)
      {
         $rows[] = $this->getRow($fetchmode);
      }
      return $rows;
   }
   function __destruct()
   {
      foreach ($this->results as $result)
      {
         @mysql_free_result($result);
      }
   }
}
?>
